package org.zjx.core;

import com.sun.jna.platform.win32.WinDef;
import org.zjx.action.IAction;
import org.zjx.operation.OperationExecutor;
import org.zjx.operation.WindowOperation;
import org.zjx.state.StateManager;

import java.awt.*;
import java.util.concurrent.CompletableFuture;

/**
 * 窗口核心接口
 * 定义游戏窗口的基本操作和状态管理功能
 */
public interface IWindow {

    /**
     * 获取窗口唯一标识
     */
    String getId();

    /**
     * 获取窗口原生句柄
     */
    WinDef.HWND getHwnd();

    void setHwnd(WinDef.HWND hwnd);

    /**
     * 获取窗口标题
     */
    String getTitle();

    /**
     * 获取进程 ID
     */
    int getProcessId();

    /**
     * 检查窗口是否存在
     */
    boolean isExists();

    /**
     * 获取窗口位置和大小
     */
    Rectangle getBounds();

    Rectangle getTrueBounds();

    /**
     * 激活窗口（置为前台）
     */
    void activate();

    /**
     * 检查窗口是否处于激活状态
     */
    boolean isActive();

    /**
     * 等待窗口激活（带超时）
     */
    boolean waitForActive(long timeoutMs);

    /**
     * 关闭窗口
     */
    void close();

    /**
     * 获取状态管理器
     */
    StateManager getState();

    /**
     * 更新窗口状态（截图分析等）
     */
    void updateState();

    /**
     * 启动自动化循环
     */
    void start();

    /**
     * 停止自动化循环
     */
    void shutdown();

    /**
     * 检查是否正在运行
     */
    boolean isRunning();

    /**
     * 执行窗口操作
     */
    <T> T execute(WindowOperation<T> operation);

    /**
     * 获取操作执行器
     */
    OperationExecutor getExecutor();


    /**
     * 提交命令 - 异步执行
     * @param Action 要执行的命令
     * @return CompletableFuture 包含执行结果
     */
    CompletableFuture<Boolean> submitAction(IAction Action);

    void executeAction(IAction Action);

    boolean isValid();

    /**
     * 等待窗口线程结束
     * @param timeout 超时时间
     * @param unit 时间单位
     * @return 是否成功结束
     * @throws InterruptedException 如果等待被中断
     */
    boolean awaitTermination(long timeout, java.util.concurrent.TimeUnit unit)
            throws InterruptedException;
}